package com.pomelo.am;

public class Exec02 {

    public static void main(String[] args) {
        // 计算器  1+2-2*3-2/1  计算优先级  * / 优先  + -   从字符串中找到 乘 * 除  / 每一轮找到乘除两种运算  这一轮计算的相对左边的 运算符号
        // 1+2-6-2/1 1+2-6-2
        String str = "1+2-2*3-2/1";
        System.out.println(calculator2(str));
    }

    public static int calculator(String str) {
        // 找乘除  当前位前一位往前找不是数字的就停止 然后裁剪  当前位后一位往后找不是数字的停止 然后裁剪  然后找加减
        str = str.replace(" ", "");
        // 找乘除
        // indexOf('*') != -1 有乘法  indexOf('/') != -1
        // contains("*") true 有乘法  contains("/") true 有除法
        // 找加减 + -
        // indexOf('+') != -1 有加法  indexOf('-') != -1 有减法
        // while (str.indexOf('*') != -1 || str.indexOf('/') != -1) {}
        while (str.contains("*") || str.contains("/")) {
            // 找乘除的下标
            int index = str.indexOf("*");  // 本轮要计算的运算符下标
            int index2 = str.indexOf("/");
            if (index == -1) { // 没有乘法
                index = index2;
            } else if (index2 != -1 && index2 < index) { // 除法，并且除法在左边
                index = index2;
            } // 找到最左边的运算符符号对应的下标
            int left = index - 1;
            int right = index + 1;
            // 找左边运算符在的下标
            while (left >= 0 && Character.isDigit(str.charAt(left))) {
                left--;
            }
            // 找右边运算符在的下标
            while (right < str.length() && Character.isDigit(str.charAt(right))) {
                right++;
            }

            int leftNumber = Integer.parseInt(str.substring(left + 1, index));
            int rightNumber = Integer.parseInt(str.substring(index + 1, right));
            int c = 0;
            // 当前这个运算符的计算结果
            if (str.charAt(index) == '*') {
                c = leftNumber * rightNumber;
            } else {
                c = leftNumber / rightNumber;
            }
            str = str.substring(0, left + 1) + c + str.substring(right);
        }
        System.out.println(str);
        // 找加减 -3-2   -5
        while (str.indexOf('+') != -1 || str.indexOf('-') != -1) {
            int index = str.indexOf('+');
            int index2 = str.indexOf('-', 1); // 避免找到符号
            if (index == -1) {
                index = index2;
            } else if (index2 != -1 && index2 < index) {
                index = index2;
            }
            if (index == -1) {
                break;
            }
            int left = index - 1;
            int right = index + 1;
            // 找左边的上一个运算符 -3-2   -5
            while (left >= 0 && (Character.isDigit(str.charAt(left)) || str.charAt(left) == '-')) {
                left--;
            }
            // 找右边的下一个运算符
            while (right < str.length() && Character.isDigit(str.charAt(right))) {
                right++;
            }

            int leftNumber = Integer.parseInt(str.substring(left + 1, index));
            int rightNumber = Integer.parseInt(str.substring(index + 1, right));
            int c = 0;

            if (str.charAt(index) == '+') {
                c = leftNumber + rightNumber;
            } else {
                c = leftNumber - rightNumber;
            }
            str = str.substring(0, left + 1) + c + str.substring(right);
        }
        System.out.println(str);
        return Integer.parseInt(str);
    }

    public static int calculator2(String str) {
        str = replaceCalculator(str, '*', '/');
        str = replaceCalculator(str, '+', '-');
        return Integer.parseInt(str);
    }

    private static String replaceCalculator(String str, char op1, char op2) {
        while (str.indexOf(op1, 1) != -1 || str.indexOf(op2, 1) != -1) {
            int index = str.indexOf(op1);
            int index2 = str.indexOf(op2, 1);
            if (index == -1) {
                index = index2;
            } else if (index2 != -1 && index2 < index) {
                index = index2;
            } // 本轮要计算的运算符下标
            int left = index - 1;
            int right = index + 1;
            // 找左边的上一个符号 带上负号
            while (left >= 0 &&
                    (Character.isDigit(str.charAt(left)) ||
                            (str.charAt(left) == '-' &&
                                    (op1 == '+' || op2 == '-')))) {
                left--;
            }
            // 找右边的下一个符号
            while (right < str.length() && Character.isDigit(str.charAt(right))) {
                right++;
            }
            int leftNumber = Integer.parseInt(str.substring(left + 1, index));
            int rightNumber = Integer.parseInt(str.substring(index + 1, right));
            int c = switch (str.charAt(index)) {
                case '+' -> leftNumber + rightNumber;
                case '-' -> leftNumber - rightNumber;
                case '*' -> leftNumber * rightNumber;
                default -> leftNumber / rightNumber;
            };
            str = str.substring(0, left + 1) + c + str.substring(right);
        }
        return str;
    }
}
